class: title-slide, center, middle <img src="data:image/png;base64,#https://raw.githubusercontent.com/rstudio/hex-stickers/7847c8e8a5da57bacacb9fe8a11aef32dd98ab44/SVG/ggplot2.svg" width="100px" /> # ggplot2 ## Ein Überblick ### Andreas Filser ### Frühjahr 2025 <style type="text/css"> .remark-code{line-height: 1.5; font-size: 90%} /*font size for manual panels*/ code, pre { font-weight: 500; /* Set font weight to normal */ } .blade1 { font-size: "80%"; /* 80% of the parent's font size */ } </style> --- # Datenvisualisierung - warum und wozu? **(1.) Deskription: ** + Überblick zu den verwendeten Daten + Sind nur junge oder alte Menschen in meinem Datensatz? + Wie häufig kommt das analysierte Ereignis vor? **(2.) Zusammenfassung der Ergebnisse:** + Schöner als Tabellen (bei guter Umsetzung) + Schneller verständlich als Tabellen (dito) *** > Diese Präsentation basiert teilweise auf dem [`{flipbookr}`](https://evamaerey.github.io/flipbookr/index.html)-Paket von [Gina Reynolds](https://evamaerey.github.io/ggplot_flipbook/ggplot_flipbook_xaringan.html#1) und den *Data Visualization* Kursen von [Danielle Navarro](https://djnavarro.github.io/satrdayjoburg/) und [Charles Lanfear](https://clanfear.github.io/R_Visualization_Workshop/). > --- # Vorbemerkungen + Zuhören, später selbst machen + Prinzip verstehen, nicht Befehle auswendig lernen + Googlen! + das [R Graphics Cookbook](http://www.cookbook-r.com/Graphs/) bietet eine umfangreiche Sammlung an Beispielplots inkl. dazugehöriger Syntax + das [ggplot2 Cheatsheet](https://github.com/rstudio/cheatsheets/blob/master/data-visualization-2.1.pdf) gibt eine Übersicht zu den wichtigsten Funktionen und Befehlen + Mehr Links am Ende --- # ggplot2 Das Paket [**ggplot2**](https://ggplot2.tidyverse.org/) basiert auf der Idee der "layered grammar of graphics". Die zu erstellende Darstellung wird in verschiedene Parameter unterteilt: * **data**: welche Daten sollen verwendet werden? * **aes**thetics: welche Variablen sollen dargestellt werden? * **geom**etrische Objekte: Punkte, Säulen, Linien, ...? * **Koordinatensystem**: numerisch, Prozent, logarithmisch, Koordianten? * **lab**els: Beschriftungen und Überschriften * **Theme**: Farbschema, Schriftgröße * ggf. Skalen --- # ggplot2 Wie alle Pakete in R müssen wir das `ggplot2` einmal installieren und bei jedem Neustart einer R Session mit `library()` laden: ``` r install.packages("ggplot2") library(ggplot2) ``` --- # Struktur von ggplot2 Ein Standardbefehl für `ggplot2` sieht in etwa so aus: ``` r ggplot(data = datensatz, aes(x = var1, y = var2, color = var3)) + geom_point() + labs(title= "Titel", subtitle = "Untertitel") + theme_minimal() ``` Zur besseren Verdeutlichung entzerre ich diese Befehle hier: ``` r ggplot(data = datensatz) + aes(x = var1) labs(x = "x-Achsenbeschriftung") + aes(y = var2) + labs(y = "y-Achsenbeschriftung") + geom_point() + labs(title= "Titel") + labs(subtitle = "Untertitel") + aes(color = var3) + labs(color = "Titel für die Legende") + theme_minimal() ``` --- # Ein erstes Beispiel: Weihnachtsbäume In den USA werden Weihnachtsbäume aus Plastik immer beliebter. Die zugrunde liegenden Daten sind im long-shape - d.h. pro Jahr haben wir zwei Zeilen mit Angaben der Verkaufszahlen. Einmal für die echten Bäumen und einmal für die aus Plastik. Ein kleiner Blick auf das Datenset: ``` r head(christmas_trees,n= 4) ``` <table> <thead> <tr> <th style="text-align:right;"> jahr </th> <th style="text-align:right;"> anz_baeume </th> <th style="text-align:left;"> baumart </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 2004 </td> <td style="text-align:right;"> 27100000 </td> <td style="text-align:left;"> Real tree </td> </tr> <tr> <td style="text-align:right;"> 2005 </td> <td style="text-align:right;"> 32800000 </td> <td style="text-align:left;"> Real tree </td> </tr> <tr> <td style="text-align:right;"> 2006 </td> <td style="text-align:right;"> 28600000 </td> <td style="text-align:left;"> Real tree </td> </tr> <tr> <td style="text-align:right;"> 2007 </td> <td style="text-align:right;"> 31300000 </td> <td style="text-align:left;"> Real tree </td> </tr> </tbody> </table> --- count: false #Ein erstes Beispiel: Weihnachtsbäume .panel1-christmas-auto[ ``` r *ggplot(data = christmas_trees) ``` ] .panel2-christmas-auto[ <!-- --> ] --- count: false #Ein erstes Beispiel: Weihnachtsbäume .panel1-christmas-auto[ ``` r ggplot(data = christmas_trees) + * aes(x = jahr) ``` ] .panel2-christmas-auto[ <!-- --> ] --- count: false #Ein erstes Beispiel: Weihnachtsbäume .panel1-christmas-auto[ ``` r ggplot(data = christmas_trees) + aes(x = jahr) + * aes(y = anz_baeume) ``` ] .panel2-christmas-auto[ <!-- --> ] --- count: false #Ein erstes Beispiel: Weihnachtsbäume .panel1-christmas-auto[ ``` r ggplot(data = christmas_trees) + aes(x = jahr) + aes(y = anz_baeume) + * geom_point() ``` ] .panel2-christmas-auto[ <!-- --> ] --- count: false #Ein erstes Beispiel: Weihnachtsbäume .panel1-christmas-auto[ ``` r ggplot(data = christmas_trees) + aes(x = jahr) + aes(y = anz_baeume) + geom_point() + * aes(color = baumart) ``` ] .panel2-christmas-auto[ <!-- --> ] --- count: false #Ein erstes Beispiel: Weihnachtsbäume .panel1-christmas-auto[ ``` r ggplot(data = christmas_trees) + aes(x = jahr) + aes(y = anz_baeume) + geom_point() + aes(color = baumart) + * scale_color_manual(values=c("red","green4")) ``` ] .panel2-christmas-auto[ <!-- --> ] --- count: false #Ein erstes Beispiel: Weihnachtsbäume .panel1-christmas-auto[ ``` r ggplot(data = christmas_trees) + aes(x = jahr) + aes(y = anz_baeume) + geom_point() + aes(color = baumart) + scale_color_manual(values=c("red","green4")) + * labs(title="Wie echt sind deine Blätter?") ``` ] .panel2-christmas-auto[ <!-- --> ] --- count: false #Ein erstes Beispiel: Weihnachtsbäume .panel1-christmas-auto[ ``` r ggplot(data = christmas_trees) + aes(x = jahr) + aes(y = anz_baeume) + geom_point() + aes(color = baumart) + scale_color_manual(values=c("red","green4")) + labs(title="Wie echt sind deine Blätter?") + * labs(subtitle="Verkaufte Weihnachtsbäume in USA | Quelle: Statista") ``` ] .panel2-christmas-auto[ <!-- --> ] --- count: false #Ein erstes Beispiel: Weihnachtsbäume .panel1-christmas-auto[ ``` r ggplot(data = christmas_trees) + aes(x = jahr) + aes(y = anz_baeume) + geom_point() + aes(color = baumart) + scale_color_manual(values=c("red","green4")) + labs(title="Wie echt sind deine Blätter?") + labs(subtitle="Verkaufte Weihnachtsbäume in USA | Quelle: Statista") + * labs(y = "Anzahl verkaufte Bäume (in Mio)") ``` ] .panel2-christmas-auto[ <!-- --> ] --- count: false #Ein erstes Beispiel: Weihnachtsbäume .panel1-christmas-auto[ ``` r ggplot(data = christmas_trees) + aes(x = jahr) + aes(y = anz_baeume) + geom_point() + aes(color = baumart) + scale_color_manual(values=c("red","green4")) + labs(title="Wie echt sind deine Blätter?") + labs(subtitle="Verkaufte Weihnachtsbäume in USA | Quelle: Statista") + labs(y = "Anzahl verkaufte Bäume (in Mio)") + * labs(x = "Jahr") ``` ] .panel2-christmas-auto[ <!-- --> ] --- count: false #Ein erstes Beispiel: Weihnachtsbäume .panel1-christmas-auto[ ``` r ggplot(data = christmas_trees) + aes(x = jahr) + aes(y = anz_baeume) + geom_point() + aes(color = baumart) + scale_color_manual(values=c("red","green4")) + labs(title="Wie echt sind deine Blätter?") + labs(subtitle="Verkaufte Weihnachtsbäume in USA | Quelle: Statista") + labs(y = "Anzahl verkaufte Bäume (in Mio)") + labs(x = "Jahr") + * labs(color = "") ``` ] .panel2-christmas-auto[ <!-- --> ] --- count: false #Ein erstes Beispiel: Weihnachtsbäume .panel1-christmas-auto[ ``` r ggplot(data = christmas_trees) + aes(x = jahr) + aes(y = anz_baeume) + geom_point() + aes(color = baumart) + scale_color_manual(values=c("red","green4")) + labs(title="Wie echt sind deine Blätter?") + labs(subtitle="Verkaufte Weihnachtsbäume in USA | Quelle: Statista") + labs(y = "Anzahl verkaufte Bäume (in Mio)") + labs(x = "Jahr") + labs(color = "") + * theme_minimal() ``` ] .panel2-christmas-auto[ <!-- --> ] <style> .panel1-christmas-auto { color: #141438; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-christmas-auto { color: NA; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-christmas-auto { color: NA; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- # Noch einmal mit kompakter Syntax .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, color = baumart)) + geom_point() + scale_color_manual(values = c("red", "green4")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", color = "") + theme_minimal() ``` ] .panel2-manual[  ] --- # Linien statt Punkte .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, color=baumart)) + * geom_line() + scale_color_manual(values = c("red", "green4")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", color = "") + theme_minimal() ``` Wir können durch Veränderung des `geom_...` schnell von einem Punkt- zu einem Liniendiagramm wechseln. Wir tauschen einfach `geom_point` durch `geom_line` aus. ] .panel2-manual[  ] --- # Linien **und** Punkte .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, color = baumart)) + * geom_point() + * geom_line() + scale_color_manual(values = c("red", "green4")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", color = "") + theme_minimal() ``` ] .panel2-manual[  ] --- # Weitere Optionen <!-- .blade1[Für `geom_line`und `geom_point` gibt es eine Vielzahl an Anpassungsmöglichkeiten] --> .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, color = baumart)) + * geom_point(shape = 17, size = 3) + * geom_line(linetype = "dashed", size = .25) + scale_color_manual(values = c("red", "green4")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", color = "") + theme_minimal() ``` Eine Übersicht zu allen `shape`s und `linetype`s findet sich bspw. [hier](http://www.cookbook-r.com/Graphs/Shapes_and_line_types/) ] .panel2-manual[  ] --- # Weitere Optionen in `aes`thetics .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, color = baumart, * size = anz_baeume)) + geom_point(shape = 17) + geom_line() + scale_color_manual(values = c("red", "green4")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", color = "") + theme_minimal() ``` Die Größe der Punkte & Linien entspricht der Verkaufszahl. ] .panel2-manual[  ] --- # Legendentitel für `size` .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, color = baumart, size = anz_baeume)) + geom_point(shape = 17) + geom_line() + scale_color_manual(values = c("red", "green4")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", color = "", * size = "Absatz (in Mio)") + theme_minimal() ``` ] .panel2-manual[  ] --- # `size` für nur ein geom_... .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, color = baumart)) + * geom_point(aes(size = anz_baeume),shape = 17) + geom_line() + scale_color_manual(values = c("red", "green4")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", color = "", size = "Absatz (in Mio)") + theme_minimal() ``` ] .panel2-manual[  ] --- # Anpassungen durch Variablen definieren .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, color = baumart)) + * geom_point(aes(size = anz_baeume, shape = baumart)) + geom_line() + scale_color_manual(values = c("red", "green4")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", color = "", size = "Absatz (in Mio)") + theme_minimal() ``` ] .panel2-manual[  ] --- # Anpassungen durch Variablen definieren .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, color = baumart)) + geom_point(aes(size = anz_baeume, shape = baumart)) + geom_line() + scale_color_manual(values = c("red", "green4")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", color = "", * shape = "Baumart", size = "Absatz (in Mio)") + theme_minimal() ``` ] .panel2-manual[  ] --- # Anpassungen durch Variablen definieren .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, color = baumart)) + * geom_point(aes(size = anz_baeume, shape = baumart)) + geom_line() + scale_color_manual(values = c("red", "green4")) + * scale_shape_manual(values = c(16,18)) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", color = "", * shape = "", size = "Absatz (in Mio)") + theme_minimal() ``` ] .panel2-manual[  ] --- # Säulendiagramme .blade1[`geom_col` erstellt Säulendiagramme] .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, color = baumart)) + * geom_col() + scale_color_manual(values = c("red", "green4")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", color = "") + theme_minimal() ``` ] .panel2-manual[  ] --- # fill und color .blade1[`fill` ist für die Flächenfarben verantwortlich, zB die Farbe der Säulen] .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, color = baumart, * fill = baumart)) + geom_col() + scale_color_manual(values = c("red", "green4")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", color = "") + theme_minimal() ``` ] .panel2-manual[  ] --- # scale_... .blade1[`scale_fill_manual` steuert die Werte für die Flächenfarben] .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col() + * scale_fill_manual(values = c("red", "green4")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + theme_minimal() ``` ] .panel2-manual[  ] --- # Säulen nebeneinander .blade1[Auch für `geom_col()` gibt es Anpassungsmöglichkeiten] .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + * geom_col(position=position_dodge()) + scale_fill_manual(values = c("red", "green4")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + theme_minimal() ``` ] .panel2-manual[  ] --- # Legendenbildung .smaller[`breaks` steuert die Zuordnung von Farben und Ausprägungen, `legend.position` in `theme` platziert die Legende.] .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + scale_fill_manual(values = c("red", "green4"), * breaks = c("Fake tree", "Real tree")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + theme_minimal() + theme(legend.position="bottom") ``` ] .panel2-manual[  ] --- # Legendenbildung .blade1[Auch die Beschriftung kann geändert werden] .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + scale_fill_manual(values = c("red", "green4"), breaks = c("Fake tree", "Real tree"), * labels = c("künstl.", "echt")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + theme_minimal() + theme(legend.position="top") ``` .smaller[Mehr zur Formatierung der Legende [hier](http://www.cookbook-r.com/Graphs/Legends_%28ggplot2%29)] ] .panel2-manual[  ] --- # Farben Selbstverständlich gibt es nicht nur `red` und `green4` als Farbauswahl. Farben können auf verschiedene Arten ausgewählt werden: + verbal - siehe Liste [hier](http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf) + mit sog. [Hex-Codes](https://www.color-hex.com/) - einfach zB. "#FF0000" anstelle von "red" einsetzen + Farbpaletten mit eigenen `scale_fill` bzw. `scale_color` Funktionen + [ColorBrewer](http://colorbrewer2.org) - bereits in `ggplot2` integriert + [scico](https://github.com/thomasp85/scico) + ein letztes Beispiel... --- # Color Brewer .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + * scale_fill_brewer(palette = "Accent") + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + theme_minimal() ``` .smaller[Der Übersichtlichkeit wurde hier `color` weggelassen, es gibt natürlich auch `scale_color_brewer()`] ] .panel2-manual[  ] --- # Color Brewer .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + * scale_fill_brewer(palette = "Paired") + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + theme_minimal() ``` ] .panel2-manual[  ] --- # Color Brewer .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + scale_fill_brewer(palette = "Accent", * breaks = c("Fake tree", "Real tree"), * labels = c("künstl.", "echt")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + theme_minimal() ``` .smaller[`breaks` und `labels` funktionieren auch in `scale_color_brewer()`] ] .panel2-manual[  ] --- # Themes .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + scale_fill_brewer(palette = "Accent", breaks = c("Fake tree", "Real tree"), labels = c("künstl.", "echt")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + * theme_classic() ``` ] .panel2-manual[  ] --- # Themes <!-- --> --- # Themes II aus [`ggthemes`](https://yutannihilation.github.io/allYourFigureAreBelongToUs/ggthemes/) <!-- --> --- # Textgröße .smaller[Der Text ist immer zu klein für Präsentationen] .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + scale_fill_brewer(palette = "Accent", breaks = c("Fake tree", "Real tree"), labels = c("künstl.", "echt")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + theme_minimal() ``` ] .panel2-manual[  ] --- # Textgröße .smaller[Der Text ist immer zu klein für Präsentationen] .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + scale_fill_brewer(palette = "Accent", breaks = c("Fake tree", "Real tree"), labels = c("künstl.", "echt")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + theme_minimal() + * theme(axis.title = element_text(size = rel(2))) ``` ] .panel2-manual[  ] --- # Textgröße .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + scale_fill_brewer(palette = "Accent", breaks = c("Fake tree", "Real tree"), labels = c("künstl.", "echt")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + theme_minimal() + * theme(axis.title.x = element_text(size = rel(2)), * axis.title.y = element_text(size = rel(.5))) ``` ] .panel2-manual[  ] --- # Textgröße .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + scale_fill_brewer(palette = "Accent", breaks = c("Fake tree", "Real tree"), labels = c("künstl.", "echt")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + theme_minimal() + theme(axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(.5)), * axis.text.y = element_text(size = rel(2))) ``` ] .panel2-manual[  ] --- # Weitere Textoptionen .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + scale_fill_brewer(palette = "Accent", breaks = c("Fake tree", "Real tree"), labels = c("künstl.", "echt")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + theme_minimal() + theme(axis.title.x = element_text(size = rel(2)), axis.title.y = element_text(size = rel(.5)), * axis.text.x = element_text(face = "bold",angle = 45), * axis.text.y = element_text(size = rel(2), family = "mono", color = "#dc322f"), * plot.title = element_text(size = rel(2), family = "serif", color = "#5d7187"), * plot.subtitle = element_text(size = rel(.9), family = "serif", face = "italic")) ``` ] .panel2-manual[  .blade1[Mehr Infos [hier](http://www.cookbook-r.com/Graphs/Fonts/)] ] --- # Weitere Textoptionen .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + scale_fill_brewer(palette = "Accent", breaks = c("Fake tree", "Real tree"), labels = c("künstl.", "echt")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + * theme_minimal() + theme(axis.text = element_text(color = "#dc322f"), plot.title = element_text(size = rel(2), color = "#5d7187"), plot.subtitle = element_text(face = "italic")) ``` ] .panel2-manual[  ] --- # Weitere Textoptionen .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + scale_fill_brewer(palette = "Accent", breaks = c("Fake tree", "Real tree"), labels = c("künstl.", "echt")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + * theme_minimal(base_size = 14) + theme(axis.text = element_text(color = "#dc322f"), plot.title = element_text(size = rel(2), color = "#5d7187"), plot.subtitle = element_text(face = "italic")) ``` ] .panel2-manual[  ] --- # Weitere Textoptionen .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + scale_fill_brewer(palette = "Accent", breaks = c("Fake tree", "Real tree"), labels = c("künstl.", "echt")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + * theme_minimal(base_size = 14, base_family = "serif") + theme(axis.text = element_text(color = "#dc322f"), plot.title = element_text(size = rel(2), color = "#5d7187"), plot.subtitle = element_text(face = "italic")) ``` ] .panel2-manual[  ] --- # Weitere Textoptionen .panel1-manual[ ``` r ggplot(data = christmas_trees, aes(x=jahr,y=anz_baeume, fill = baumart)) + geom_col(position=position_dodge()) + scale_fill_brewer(palette = "Accent", breaks = c("Fake tree", "Real tree"), labels = c("künstl.", "echt")) + labs(title = "Wie echt sind deine Blätter?", subtitle = "Verkaufte Weihnachtsbäume in USA | Quelle: Statista", y = "Anzahl verkaufte Bäume (in Mio)", x = "Jahr", fill = "") + * theme_minimal(base_size = 8, base_family = "mono") + theme(axis.text = element_text(color = "#dc322f"), plot.title = element_text(size = rel(2), color = "#5d7187"), plot.subtitle = element_text(face = "italic")) ``` ] .panel2-manual[  ] --- # Übungsdaten Wir werden mit Daten aus dem [Gapminder](http://www.gapminder.org) Projekt arbeiten. Ein Auszug aus diesen Daten kann direkt in R mit dem Paket `gapminder` von Jenny Bryan verwendet werden. Der Datensatz enthält die Lebenserwartung `lifeExp`, Bevölkerungszahlen `pop` und BIP pro Person `gdpPercap` für 142 Länder zwischen 1952 und 2007: <table> <thead> <tr> <th style="text-align:left;"> country </th> <th style="text-align:left;"> continent </th> <th style="text-align:right;"> year </th> <th style="text-align:right;"> lifeExp </th> <th style="text-align:right;"> pop </th> <th style="text-align:right;"> gdpPercap </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Iran </td> <td style="text-align:left;"> Asia </td> <td style="text-align:right;"> 1982 </td> <td style="text-align:right;"> 59.62 </td> <td style="text-align:right;"> 43072751 </td> <td style="text-align:right;"> 7608.335 </td> </tr> <tr> <td style="text-align:left;"> Norway </td> <td style="text-align:left;"> Europe </td> <td style="text-align:right;"> 1972 </td> <td style="text-align:right;"> 74.34 </td> <td style="text-align:right;"> 3933004 </td> <td style="text-align:right;"> 18965.056 </td> </tr> </tbody> </table> --- # Übung 1 .panel1-manual[ <!-- --> ] .panel3-manual[ #### Visualisieren Sie den Verlauf der Lebenserwartung, Bevölkerungszahl oder des BIP pro Kopf über die Zeit! + Installieren Sie das Paket `install.packages("gapminder")` + Mit `gdf <- gapminder::gapminder` können Sie die Daten aufrufen und unter `gdf` ablegen (der Name ist natürlich frei wählbar) + Wählen Sie zwei oder mehr Länder aus und legen Sie diese in einem neuen `data.frame` ab zB. filtern nach _Uga_nda oder _Can_ada mit `{dplyr}`: ``` r df1 <- gdf %>% filter(grepl("Uga|Can",country)) ``` + `country` ist als `factor` definiert, was zu Problemen führt bei der Darstellung: `df1$country <- as.character(df1$country)` ``` r df1$country <- as.character(df1$country) ``` ### Wenn etwas unklar ist, nicht funktioniert usw. **fragen!** <br> Viel Spaß! 👩💻 👨💻 ] --- # Wenn Farben & Formen nicht reichen Manchmal haben wir auch Daten, für einfach nur verschiedene Farben oder Shapes nicht hilfreich sind. Ein Beispiel ist dieser Datensatz, der die Inhaftungszahlen in den USA nach Bevölkerungsgruppen und Urbanität aufschlüsselt: <table> <thead> <tr> <th style="text-align:right;"> year </th> <th style="text-align:left;"> urbanicity </th> <th style="text-align:left;"> pop_category </th> <th style="text-align:right;"> rate_per_100000 </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 1983 </td> <td style="text-align:left;"> rural </td> <td style="text-align:left;"> Black </td> <td style="text-align:right;"> 1116.8762 </td> </tr> <tr> <td style="text-align:right;"> 1983 </td> <td style="text-align:left;"> rural </td> <td style="text-align:left;"> White </td> <td style="text-align:right;"> 154.6412 </td> </tr> <tr> <td style="text-align:right;"> 1983 </td> <td style="text-align:left;"> small/mid </td> <td style="text-align:left;"> Black </td> <td style="text-align:right;"> 1137.5779 </td> </tr> <tr> <td style="text-align:right;"> 1983 </td> <td style="text-align:left;"> small/mid </td> <td style="text-align:left;"> White </td> <td style="text-align:right;"> 149.7800 </td> </tr> <tr> <td style="text-align:right;"> 1983 </td> <td style="text-align:left;"> suburban </td> <td style="text-align:left;"> Black </td> <td style="text-align:right;"> 880.4485 </td> </tr> </tbody> </table> Die Daten gibt es [hier](https://github.com/rfordatascience/tidytuesday/tree/master/data/2019/2019-01-22) und so können sie direkt mit R heruntergeladen werden: .smaller[.smaller[ ``` r prison_file <- "Pfad/in/den/gewünschten/Ordner/prison_summary.csv" # Dateiname url <- "https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-01-22/prison_summary.csv" # Datenquelle (URL) # Daten herunterladen und speichern if (!file.exists(file)) { download.file(url = url,mode = "wb", destfile = prison_file) } df2 <- readr::read_csv(prison_file) %>% # einlesen filter(!(pop_category %in% c("Female", "Male", "Total", "Other"))) # filtern ``` ]] --- # Wenn Farben & Formen nicht reichen .blade1[Das ist so ein bisschen.... *viel*] .panel1-manual[ ``` r ggplot(data = df2) + aes(x = year, y = rate_per_100000, color = pop_category, shape = urbanicity) + geom_line() + geom_point() + labs(title = "Hinhaftierung nach Ethnie and Urbanität", subtitle = "USA, 1983-2015", caption = "Quelle: Vera Institute of Justice", x = "", y = "Incarcerated per 100000") + theme_minimal() ``` ] .panel2-manual[  ] --- # facet_grid() .panel1-manual[ ``` r ggplot(data = df2) + aes(x = year, y = rate_per_100000) + * facet_grid(urbanicity~pop_category) + geom_line() + labs(title = "Hinhaftierung nach Ethnie and Urbanität", subtitle = "USA, 1983-2015", caption = "Quelle: Vera Institute of Justice", x = "", y = "Incarcerated per 100000") + theme_minimal() ``` .blade1[`geom_point` ist dann eher unübersichtlich, daher nur jeweils eine Linie] ] .panel2-manual[  ] --- # facet_grid() .panel1-manual[ ``` r ggplot(data = df2) + aes(x = year, y = rate_per_100000) + facet_grid(urbanicity~pop_category) + geom_line() + labs(title = "Hinhaftierung nach Ethnie and Urbanität", subtitle = "USA, 1983-2015", caption = "Quelle: Vera Institute of Justice", x = "", y = "Incarcerated per 100000") + theme_minimal() + theme( * strip.text.y = element_text(angle = 0), * strip.text.x = element_text(family = "serif") ) ``` ] .panel2-manual[  ] --- # facet_grid() .panel1-manual[ ``` r ggplot(data = df2) + aes(x = year, y = rate_per_100000, * color = urbanicity) + * facet_grid(.~pop_category) + geom_line() + labs(title = "Hinhaftierung nach Ethnie and Urbanität", subtitle = "USA, 1983-2015", caption = "Quelle: Vera Institute of Justice", x = "", y = "Incarcerated per 100000") + theme_minimal() + theme( strip.text.y = element_text(angle = 0) ) ``` ] .panel2-manual[  ] --- # Zwei-Schrittlösung für Individualdaten In der Regel haben wir den Sozialwissenschaften aber Individualdaten, bspw. wenn wir ein Säulendiagramm aus den Familienstands- und Geschlechtsangaben aus dem [Allbus 2016](https://www.gesis.org/allbus) erstellen. .smaller[ ``` r a16_ft <- readr::read_delim("ZA5250_v2-0-0.csv",delim = ";") %>% filter(work == 1, age <= 64, educ %in% 1:5) %>% mutate(across(everything(),~ifelse(.x<0,NA,.)), across(c(educ,sex,eastwest,gkpol),~factor(.x)), sex = factor(sex, levels = c(1,2), labels = c("m","w")) ) %>% filter(complete.cases(sex, age , educ , eastwest , gkpol)) ``` ] So sehen die Ausgangsdaten aus: <table> <thead> <tr> <th style="text-align:right;"> respid </th> <th style="text-align:left;"> sex </th> <th style="text-align:right;"> mstat </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 1 </td> <td style="text-align:left;"> w </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;"> 2 </td> <td style="text-align:left;"> m </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;"> 3 </td> <td style="text-align:left;"> m </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;"> 6 </td> <td style="text-align:left;"> m </td> <td style="text-align:right;"> 4 </td> </tr> <tr> <td style="text-align:right;"> 9 </td> <td style="text-align:left;"> m </td> <td style="text-align:right;"> 1 </td> </tr> </tbody> </table> --- # Schritt 1: Häufigkeitstabelle .panel1-manual[ <br> ``` r xtabs(~sex+mstat, data = a16_ft) ``` <br><br> ``` r kt <- xtabs(~sex+mstat, data = a16_ft) tab_df <- data.frame( kt ) head(tab_df) ``` ] .panel2-manual[ ``` mstat sex 1 2 3 4 5 6 9 m 518 20 7 72 333 1 0 w 240 10 14 67 201 4 1 ``` <br><br> <table> <thead> <tr> <th style="text-align:left;"> sex </th> <th style="text-align:left;"> mstat </th> <th style="text-align:right;"> Freq </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> m </td> <td style="text-align:left;"> 1 </td> <td style="text-align:right;"> 518 </td> </tr> <tr> <td style="text-align:left;"> w </td> <td style="text-align:left;"> 1 </td> <td style="text-align:right;"> 240 </td> </tr> <tr> <td style="text-align:left;"> m </td> <td style="text-align:left;"> 2 </td> <td style="text-align:right;"> 20 </td> </tr> <tr> <td style="text-align:left;"> w </td> <td style="text-align:left;"> 2 </td> <td style="text-align:right;"> 10 </td> </tr> <tr> <td style="text-align:left;"> m </td> <td style="text-align:left;"> 3 </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> w </td> <td style="text-align:left;"> 3 </td> <td style="text-align:right;"> 14 </td> </tr> </tbody> </table> ] --- # Schritt 2: Säulendiagramm .panel1-manual[ ``` r *ggplot(data = tab_df) + aes(x = mstat, y = Freq, fill = sex ) + geom_col(position=position_dodge()) + scale_fill_manual(values = c("navajowhite","navy"), breaks = c("m","w"), labels = c("Männer", "Frauen")) + theme_minimal() + labs(title = "Familienstand", subtitle = "Absolute Häufigkeiten nach Geschlecht", caption = "Quelle: Allbus 2016", x = "Familienstand", y = "Absolute Häufigkeit", fill = "Geschlecht" ) ``` ] .panel2-manual[  ] --- # Prozente statt absolute Häufigkeiten ...das geht genauso auch für Zeilenprozente (& Spaltenprozente) .panel1-manual[ ``` r xtabs(~sex+mstat, data = a16_ft) %>% prop.table(., margin = 1) %>% round(.,3) ``` <br> ``` r tab_df2 <- xtabs(~sex+mstat, data = a16_ft) %>% prop.table(., margin = 1) %>% round(.,3) %>% data.frame() ``` ] .panel2-manual[ ``` mstat sex 1 2 3 4 5 6 9 m 0.545 0.021 0.007 0.076 0.350 0.001 0.000 w 0.447 0.019 0.026 0.125 0.374 0.007 0.002 ``` <br> <table> <thead> <tr> <th style="text-align:left;"> sex </th> <th style="text-align:left;"> mstat </th> <th style="text-align:right;"> Freq </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> m </td> <td style="text-align:left;"> 1 </td> <td style="text-align:right;"> 0.545 </td> </tr> <tr> <td style="text-align:left;"> w </td> <td style="text-align:left;"> 1 </td> <td style="text-align:right;"> 0.447 </td> </tr> <tr> <td style="text-align:left;"> m </td> <td style="text-align:left;"> 2 </td> <td style="text-align:right;"> 0.021 </td> </tr> <tr> <td style="text-align:left;"> w </td> <td style="text-align:left;"> 2 </td> <td style="text-align:right;"> 0.019 </td> </tr> <tr> <td style="text-align:left;"> m </td> <td style="text-align:left;"> 3 </td> <td style="text-align:right;"> 0.007 </td> </tr> <tr> <td style="text-align:left;"> w </td> <td style="text-align:left;"> 3 </td> <td style="text-align:right;"> 0.026 </td> </tr> </tbody> </table> ] --- # Säulendiagramm mit Zeilenprozenten .panel1-manual[ ``` r ggplot(data = tab_df2) + aes(x = mstat, y = Freq, fill = sex ) + geom_col(position=position_dodge()) + scale_fill_manual(values = c("#F7B449","#132157"), breaks = c("m","w"), labels = c("Männer", "Frauen")) + theme_minimal() + labs(title = "Familienstand", subtitle = "Anteile pro Geschlecht", caption = "Quelle: Allbus 2016", x = "Familienstand", y = "Relative Häufigkeit", fill = "Geschlecht" ) ``` ] .panel2-manual[  ] --- # Achsenformat anpassen: numerische Werte .panel1-manual[ ``` r *# install.packages("scales") ggplot(data = tab_df2) + aes(x = mstat, y = Freq, fill = sex ) + geom_col(position=position_dodge()) + scale_fill_manual(values = c("#F7B449","#132157"), breaks = c("m","w"), labels = c("Männer", "Frauen")) + theme_minimal() + labs(title = "Familienstand", subtitle = "Anteile pro Geschlecht", caption = "Quelle: Allbus 2016", x = "Familienstand", y = "Relative Häufigkeit", fill = "Geschlecht" ) + * scale_y_continuous(labels=scales::percent) ``` ] .panel2-manual[  ] --- # Achsenformat anpassen: kategoriale Werte .panel1-manual[ ``` r ggplot(data = tab_df2) + aes(x = mstat, y = Freq, fill = sex ) + geom_col(position=position_dodge()) + scale_fill_manual(values = c("#F7B449","#132157"), breaks = c("m","w"), labels = c("Männer", "Frauen")) + theme_minimal() + labs(title = "Familienstand", subtitle = "Anteile pro Geschlecht", caption = "Quelle: Allbus 2016", x = "Familienstand", y = "Relative Häufigkeit", fill = "Geschlecht" ) + scale_y_continuous(labels=scales::percent) + scale_x_discrete( * breaks = c(1:6,9), * labels = c("verh. zus.","verh. get.", * "verw.", "gesch.","ledig", * "lp. zus.","lp. get.")) ``` ] .panel2-manual[  ] --- # Achsenformat anpassen: Umbrüche mit `\n` .panel1-manual[ ``` r ggplot(data = tab_df2) + aes(x = mstat, y = Freq, fill = sex ) + geom_col(position=position_dodge()) + scale_fill_manual(values = c("#F7B449","#132157"), breaks = c("m","w"), labels = c("Männer", "Frauen")) + theme_minimal() + labs(title = "Familienstand", subtitle = "Anteile pro Geschlecht", caption = "Quelle: Allbus 2016", x = "Familienstand", y = "Relative Häufigkeit", fill = "Geschlecht" ) + scale_y_continuous(labels=scales::percent) + scale_x_discrete( * breaks = c(1:6,9), * labels = c("verh.\nzus.","verh.\nget.", * "verw.", "gesch.","ledig", * "lebensp.\nzus.","lebensp.\nget.")) ``` ] .panel2-manual[  ] --- # Achsenformat + `scale_ _continuous` vs. `scale_ _discrete` + Numerische Achsen können auch transformiert, zB. logarithmisiert werden + Mehr [hier](http://www.cookbook-r.com/Graphs/Axes_%28ggplot2%29) --- # Export/Speichern von ggplots Für den Export von ggplots können `ggsave()` verwenden, es wird automatisch der letzte aufgerufene Plot gespeichert. Allerdings empfiehlt es sich, den plot als Objekt zu speichern und diesen dann in `ggsave()` explizit aufzurufen. .smaller[ ``` r plot1 <- ggplot(data = ...) + geom_... ggsave(plot = plot1, filename = "C:/Users/Filser/Dokumente/plot1.png") ``` ] + Die Größe der exportierten Datei kann mit `height = 3, width = 5, units = "cm"` auf 3x5cm gesetzt werden. + Der Hintergrund kann mit der Option `bg = "transparent"` auf Transparent gesetzt werden (hilfreich für Integration in PowerPoint) + Mit `dpi = ` kann die Auflösung der Grafiken verändert werden .smaller[ ``` r ggsave(plot = plot1, height = 3, width = 5, units = "cm", dpi = 600, filename = "C:/Users/Filser/Dokumente/plot1.png") ``` [Mehr zum evtl. Problemen mit Größen-Settings mit ggsave()](https://www.christophenicault.com/post/understand_size_dimension_ggplot2/) ] --- # Weitere Optionen + `ylim()` und `xlim()` kontrollieren die x- und y-Achsenspannweite, zB. setzt `+ ylim(c(0,35))` die y-Achse auf 0-35. *Achtung!* alle Werte außerhalb werden dann komplett ignoriert! + in `+ theme()` können unzählige weiterer Optionen festgelegt werden, `theme()` ist ein zusätzliches Layer und sollte möglichst *nach* `theme_minimal()` usw. angehängt werden. Eine nützliche Option ist `+theme(aspect.ratio = 1)` um das Seitenverhältnis auf 1:1 zu setzen <!-- + [Schriftgröße]() --> <!-- + [Schriftstil]() --> --- # Übungsaufgaben 2 Lesen Sie den kumulierten Allbus-Datensatz ein (siehe StudIP) + Erstellen Sie ein Säulendiagramm für `gkpol` (Größenklassen für die Wohngemeinde) + Beschriften Sie die Achsen, verändern Sie die Position der Legende + Verwenden Sie Farben aus dem [colorbrewer](http://colorbrewer2.org/) --- # Teil 2: Koeffizientenplots --- # Gender Pay Gap .panel1-manual[ ``` r m1 <- lm(inc ~ sex , data = a16_ft) m2 <- lm(inc ~ sex + age , data = a16_ft) m3 <- lm(inc ~ sex + age + educ + eastwest, data = a16_ft) modelsummary::modelsummary(models = list("m1"=m1, "m2"=m2, "m3"=m3), output = "kableExtra", stars=T,gof_omit = "Adj|IC|Log|F|RMSE") ``` ] .panel2-manual[ <div class="tabwid"><style>.cl-67db42f2{}.cl-67d0d362{font-family:'Fira Mono';font-size:7pt;font-weight:bold;font-style:normal;text-decoration:none;color:rgba(0, 0, 0, 1.00);background-color:transparent;}.cl-67d0d36c{font-family:'Fira Mono';font-size:7pt;font-weight:normal;font-style:normal;text-decoration:none;color:rgba(0, 0, 0, 1.00);background-color:transparent;}.cl-67d4e95c{margin:0;text-align:left;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);padding-bottom:0;padding-top:0;padding-left:5pt;padding-right:5pt;line-height: 1;background-color:transparent;}.cl-67d50504{width:0.75in;background-color:rgba(207, 224, 231, 1.00);vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-67d50505{width:0.75in;background-color:rgba(255, 228, 189, 1.00);vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-67d5050e{width:0.75in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-67d50518{width:0.75in;background-color:transparent;vertical-align: middle;border-bottom: 1.5pt solid rgba(127, 127, 127, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-67d50519{width:0.75in;background-color:rgba(255, 228, 189, 1.00);vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 1.5pt solid rgba(127, 127, 127, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}</style><table data-quarto-disable-processing='true' class='cl-67db42f2'><thead><tr style="overflow-wrap:break-word;"><th class="cl-67d50504"><p class="cl-67d4e95c"><span class="cl-67d0d362"> </span></p></th><th class="cl-67d50504"><p class="cl-67d4e95c"><span class="cl-67d0d362">m1</span></p></th><th class="cl-67d50504"><p class="cl-67d4e95c"><span class="cl-67d0d362">m2</span></p></th><th class="cl-67d50504"><p class="cl-67d4e95c"><span class="cl-67d0d362">m3</span></p></th></tr></thead><tbody><tr style="overflow-wrap:break-word;"><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(Intercept)</span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">2475.516***</span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">1220.829***</span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">213.448</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(41.537)</span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(122.583)</span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(387.935)</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">sexw</span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">-640.816***</span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">-607.369***</span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">-690.624***</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(69.281)</span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(66.626)</span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(60.148)</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">age</span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">28.682***</span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">32.666***</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(2.650)</span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(2.391)</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">educ2</span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">340.298</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(384.968)</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">educ3</span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">801.878*</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(381.045)</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">educ4</span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">1188.542**</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(388.742)</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">educ5</span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">1620.599***</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(381.293)</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">eastwest2</span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50505"><p class="cl-67d4e95c"><span class="cl-67d0d36c">-548.741***</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d50518"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50518"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50518"><p class="cl-67d4e95c"><span class="cl-67d0d36c"></span></p></td><td class="cl-67d50518"><p class="cl-67d4e95c"><span class="cl-67d0d36c">(63.970)</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d50519"><p class="cl-67d4e95c"><span class="cl-67d0d36c">Num.Obs.</span></p></td><td class="cl-67d50519"><p class="cl-67d4e95c"><span class="cl-67d0d36c">1391</span></p></td><td class="cl-67d50519"><p class="cl-67d4e95c"><span class="cl-67d0d36c">1391</span></p></td><td class="cl-67d50519"><p class="cl-67d4e95c"><span class="cl-67d0d36c">1391</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">R2</span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">0.058</span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">0.131</span></p></td><td class="cl-67d5050e"><p class="cl-67d4e95c"><span class="cl-67d0d36c">0.306</span></p></td></tr></tbody><tfoot><tr style="overflow-wrap:break-word;"><td colspan="4"class="cl-67d50504"><p class="cl-67d4e95c"><span class="cl-67d0d362">+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001</span></p></td></tr></tfoot></table></div> ] --- # Koeffizientenplot <img src="data:image/png;base64,#D:/uolCloud/webseite/andreas/courses/ggplot_flipbook/index_files/figure-html/coefplt_sneak-1.png" width="50%" height="50%" style="display: block; margin: auto;" /> --- # Modelloutput vorbereiten .blade1[Klassischer Modell-Output mit `summary()`:] .smaller[ ``` r summary(m3) ``` ] .smaller[.smaller[ ``` Call: lm(formula = inc ~ sex + age + educ + eastwest, data = a16_ft) Residuals: Min 1Q Median 3Q Max -3146.6 -606.8 -134.6 428.0 6302.7 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 213.448 387.935 0.550 0.58226 sexw -690.624 60.148 -11.482 < 2e-16 *** age 32.666 2.391 13.663 < 2e-16 *** educ2 340.298 384.968 0.884 0.37687 educ3 801.878 381.045 2.104 0.03552 * educ4 1188.542 388.742 3.057 0.00228 ** educ5 1620.599 381.293 4.250 2.28e-05 *** eastwest2 -548.741 63.970 -8.578 < 2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 1067 on 1383 degrees of freedom (98 Beobachtungen als fehlend gelöscht) Multiple R-squared: 0.3057, Adjusted R-squared: 0.3022 F-statistic: 87.01 on 7 and 1383 DF, p-value: < 2.2e-16 ``` ]] --- # Modelloutput vorbereiten .blade1[`tidy` aus dem Paket `broom` wandelt Modelloutputs in data.frames um:] .smaller[ ``` r install.packages("broom") ``` ``` r m3 <- lm(inc ~ sex + age + educ + eastwest , data = a16_ft) library(broom) tidy(m3) ``` ] .smaller[ <table> <thead> <tr> <th style="text-align:left;"> term </th> <th style="text-align:right;"> estimate </th> <th style="text-align:right;"> std.error </th> <th style="text-align:right;"> statistic </th> <th style="text-align:right;"> p.value </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> (Intercept) </td> <td style="text-align:right;"> 213.448 </td> <td style="text-align:right;"> 387.935 </td> <td style="text-align:right;"> 0.550 </td> <td style="text-align:right;"> 0.582 </td> </tr> <tr> <td style="text-align:left;"> sexw </td> <td style="text-align:right;"> -690.624 </td> <td style="text-align:right;"> 60.148 </td> <td style="text-align:right;"> -11.482 </td> <td style="text-align:right;"> 0.000 </td> </tr> <tr> <td style="text-align:left;"> age </td> <td style="text-align:right;"> 32.666 </td> <td style="text-align:right;"> 2.391 </td> <td style="text-align:right;"> 13.663 </td> <td style="text-align:right;"> 0.000 </td> </tr> <tr> <td style="text-align:left;"> educ2 </td> <td style="text-align:right;"> 340.298 </td> <td style="text-align:right;"> 384.968 </td> <td style="text-align:right;"> 0.884 </td> <td style="text-align:right;"> 0.377 </td> </tr> <tr> <td style="text-align:left;"> educ3 </td> <td style="text-align:right;"> 801.878 </td> <td style="text-align:right;"> 381.045 </td> <td style="text-align:right;"> 2.104 </td> <td style="text-align:right;"> 0.036 </td> </tr> <tr> <td style="text-align:left;"> educ4 </td> <td style="text-align:right;"> 1188.542 </td> <td style="text-align:right;"> 388.742 </td> <td style="text-align:right;"> 3.057 </td> <td style="text-align:right;"> 0.002 </td> </tr> <tr> <td style="text-align:left;"> educ5 </td> <td style="text-align:right;"> 1620.599 </td> <td style="text-align:right;"> 381.293 </td> <td style="text-align:right;"> 4.250 </td> <td style="text-align:right;"> 0.000 </td> </tr> <tr> <td style="text-align:left;"> eastwest2 </td> <td style="text-align:right;"> -548.741 </td> <td style="text-align:right;"> 63.970 </td> <td style="text-align:right;"> -8.578 </td> <td style="text-align:right;"> 0.000 </td> </tr> </tbody> </table> ] --- # Modelloutput vorbereiten .blade1[Mit `conf.int` bekommen wir zusätzlich die Konfidenzintervalle ausgegeben:] .smaller[ ``` r install.packages("broom") ``` ``` r library(broom) tidy(m3, * conf.int = 95) ``` ] .smaller[ <table> <thead> <tr> <th style="text-align:left;"> term </th> <th style="text-align:right;"> estimate </th> <th style="text-align:right;"> std.error </th> <th style="text-align:right;"> statistic </th> <th style="text-align:right;"> p.value </th> <th style="text-align:right;"> conf.low </th> <th style="text-align:right;"> conf.high </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> (Intercept) </td> <td style="text-align:right;"> 213.448 </td> <td style="text-align:right;"> 387.935 </td> <td style="text-align:right;"> 0.550 </td> <td style="text-align:right;"> 0.582 </td> <td style="text-align:right;"> -547.556 </td> <td style="text-align:right;"> 974.453 </td> </tr> <tr> <td style="text-align:left;"> sexw </td> <td style="text-align:right;"> -690.624 </td> <td style="text-align:right;"> 60.148 </td> <td style="text-align:right;"> -11.482 </td> <td style="text-align:right;"> 0.000 </td> <td style="text-align:right;"> -808.615 </td> <td style="text-align:right;"> -572.632 </td> </tr> <tr> <td style="text-align:left;"> age </td> <td style="text-align:right;"> 32.666 </td> <td style="text-align:right;"> 2.391 </td> <td style="text-align:right;"> 13.663 </td> <td style="text-align:right;"> 0.000 </td> <td style="text-align:right;"> 27.976 </td> <td style="text-align:right;"> 37.356 </td> </tr> <tr> <td style="text-align:left;"> educ2 </td> <td style="text-align:right;"> 340.298 </td> <td style="text-align:right;"> 384.968 </td> <td style="text-align:right;"> 0.884 </td> <td style="text-align:right;"> 0.377 </td> <td style="text-align:right;"> -414.886 </td> <td style="text-align:right;"> 1095.482 </td> </tr> <tr> <td style="text-align:left;"> educ3 </td> <td style="text-align:right;"> 801.878 </td> <td style="text-align:right;"> 381.045 </td> <td style="text-align:right;"> 2.104 </td> <td style="text-align:right;"> 0.036 </td> <td style="text-align:right;"> 54.389 </td> <td style="text-align:right;"> 1549.366 </td> </tr> <tr> <td style="text-align:left;"> educ4 </td> <td style="text-align:right;"> 1188.542 </td> <td style="text-align:right;"> 388.742 </td> <td style="text-align:right;"> 3.057 </td> <td style="text-align:right;"> 0.002 </td> <td style="text-align:right;"> 425.955 </td> <td style="text-align:right;"> 1951.129 </td> </tr> <tr> <td style="text-align:left;"> educ5 </td> <td style="text-align:right;"> 1620.599 </td> <td style="text-align:right;"> 381.293 </td> <td style="text-align:right;"> 4.250 </td> <td style="text-align:right;"> 0.000 </td> <td style="text-align:right;"> 872.623 </td> <td style="text-align:right;"> 2368.574 </td> </tr> <tr> <td style="text-align:left;"> eastwest2 </td> <td style="text-align:right;"> -548.741 </td> <td style="text-align:right;"> 63.970 </td> <td style="text-align:right;"> -8.578 </td> <td style="text-align:right;"> 0.000 </td> <td style="text-align:right;"> -674.229 </td> <td style="text-align:right;"> -423.253 </td> </tr> </tbody> </table> ] --- # Modelloutput vorbereiten .blade1[Den Output aus `tidy()` legen wir als `data.frame` ab:] ``` r df_coef <- tidy(m3, conf.int = 95) ``` .blade1[Diesen `data.frame` verwenden wir dann für einen **ggplot**:] ``` r ggplot(data = df_coef, aes(y = term, x = estimate)) ``` --- count: false #Koeffzientenplot .panel1-coefplotreveal-auto[ ``` r *ggplot(data = df_coef, * aes(y = term, x = estimate)) ``` ] .panel2-coefplotreveal-auto[ <!-- --> ] --- count: false #Koeffzientenplot .panel1-coefplotreveal-auto[ ``` r ggplot(data = df_coef, aes(y = term, x = estimate)) + * geom_vline(aes(xintercept = 0),linetype = 2) ``` ] .panel2-coefplotreveal-auto[ <!-- --> ] --- count: false #Koeffzientenplot .panel1-coefplotreveal-auto[ ``` r ggplot(data = df_coef, aes(y = term, x = estimate)) + geom_vline(aes(xintercept = 0),linetype = 2) + * geom_point(size = 2) ``` ] .panel2-coefplotreveal-auto[ <!-- --> ] --- count: false #Koeffzientenplot .panel1-coefplotreveal-auto[ ``` r ggplot(data = df_coef, aes(y = term, x = estimate)) + geom_vline(aes(xintercept = 0),linetype = 2) + geom_point(size = 2) + * geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) ``` ] .panel2-coefplotreveal-auto[ <!-- --> ] --- count: false #Koeffzientenplot .panel1-coefplotreveal-auto[ ``` r ggplot(data = df_coef, aes(y = term, x = estimate)) + geom_vline(aes(xintercept = 0),linetype = 2) + geom_point(size = 2) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + * aes(height = .25) ``` ] .panel2-coefplotreveal-auto[ <!-- --> ] --- count: false #Koeffzientenplot .panel1-coefplotreveal-auto[ ``` r ggplot(data = df_coef, aes(y = term, x = estimate)) + geom_vline(aes(xintercept = 0),linetype = 2) + geom_point(size = 2) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .25) + * theme_minimal() ``` ] .panel2-coefplotreveal-auto[ <!-- --> ] --- count: false #Koeffzientenplot .panel1-coefplotreveal-auto[ ``` r ggplot(data = df_coef, aes(y = term, x = estimate)) + geom_vline(aes(xintercept = 0),linetype = 2) + geom_point(size = 2) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .25) + theme_minimal() + * aes(color = sub("\\d$", "", term) ) ``` ] .panel2-coefplotreveal-auto[ <!-- --> ] --- count: false #Koeffzientenplot .panel1-coefplotreveal-auto[ ``` r ggplot(data = df_coef, aes(y = term, x = estimate)) + geom_vline(aes(xintercept = 0),linetype = 2) + geom_point(size = 2) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .25) + theme_minimal() + aes(color = sub("\\d$", "", term) ) + * scale_color_brewer(palette = "Paired") ``` ] .panel2-coefplotreveal-auto[ <!-- --> ] --- count: false #Koeffzientenplot .panel1-coefplotreveal-auto[ ``` r ggplot(data = df_coef, aes(y = term, x = estimate)) + geom_vline(aes(xintercept = 0),linetype = 2) + geom_point(size = 2) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .25) + theme_minimal() + aes(color = sub("\\d$", "", term) ) + scale_color_brewer(palette = "Paired") + * guides(color = 'none') ``` ] .panel2-coefplotreveal-auto[ <!-- --> ] --- count: false #Koeffzientenplot .panel1-coefplotreveal-auto[ ``` r ggplot(data = df_coef, aes(y = term, x = estimate)) + geom_vline(aes(xintercept = 0),linetype = 2) + geom_point(size = 2) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .25) + theme_minimal() + aes(color = sub("\\d$", "", term) ) + scale_color_brewer(palette = "Paired") + guides(color = 'none') + * labs(y = "" ) ``` ] .panel2-coefplotreveal-auto[ <!-- --> ] --- count: false #Koeffzientenplot .panel1-coefplotreveal-auto[ ``` r ggplot(data = df_coef, aes(y = term, x = estimate)) + geom_vline(aes(xintercept = 0),linetype = 2) + geom_point(size = 2) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .25) + theme_minimal() + aes(color = sub("\\d$", "", term) ) + scale_color_brewer(palette = "Paired") + guides(color = 'none') + labs(y = "" ) + * labs(x = expression(hat(beta)) ) ``` ] .panel2-coefplotreveal-auto[ <!-- --> ] --- count: false #Koeffzientenplot .panel1-coefplotreveal-auto[ ``` r ggplot(data = df_coef, aes(y = term, x = estimate)) + geom_vline(aes(xintercept = 0),linetype = 2) + geom_point(size = 2) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .25) + theme_minimal() + aes(color = sub("\\d$", "", term) ) + scale_color_brewer(palette = "Paired") + guides(color = 'none') + labs(y = "" ) + labs(x = expression(hat(beta)) ) + * labs(title = "Einkommen", * subtitle = "Vollzeitbeschäftige", * caption= "Quelle: Allbus 2016" ) ``` ] .panel2-coefplotreveal-auto[ <!-- --> ] <style> .panel1-coefplotreveal-auto { color: #141438; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel2-coefplotreveal-auto { color: NA; width: 49%; hight: 32%; float: left; padding-left: 1%; font-size: 80% } .panel3-coefplotreveal-auto { color: NA; width: NA%; hight: 33%; float: left; padding-left: 1%; font-size: 80% } </style> --- #Koeffzientenplot .panel1-manual[ ``` r ggplot(data = df_coef, aes(y = term, x = estimate)) + geom_vline(aes(xintercept = 0),linetype = 2) + geom_point(size = 2) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .25) + theme_minimal() + aes(color = sub("\\d$", "", term) ) + scale_color_brewer(palette = "Paired") + guides(color = 'none') + labs(y = "" ) + labs(x = expression(hat(beta)) ) + labs(title = "Einkommen", subtitle = "Vollzeitbeschäftige", caption= "Quelle: Allbus 2016" ) + * scale_y_discrete(limits = rev(factor(df_coef$term)), * labels = c("neue Länder", * "Abi","Fachabi","Mittlere Reife", * "Hauptschule", * "Alter","Frau", * "Intercept") ) ``` ] .panel2-manual[  ] --- # Koeffzientenplot labeln mit Vector .panel1-manual[ ``` r lab_vec <- c( "(Intercept)"= "Intercept", "sexw" = "Frau", "age" = "Alter", "educ2" = "Hauptschule", "educ3" = "Mittlere Reife", "educ4" = "Fachabi", "educ5" = "Abi", "eastwest2" = "neue Länder" ) ggplot(data = df_coef, aes(y = term, x = estimate)) + geom_vline(aes(xintercept = 0),linetype = 2) + geom_point(size = 2) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .25) + theme_minimal() + aes(color = sub("\\d$", "", term) ) + scale_color_brewer(palette = "Paired") + guides(color = 'none') + labs(y = "" ) + labs(x = expression(hat(beta)) ) + labs(title = "Einkommen", subtitle = "Vollzeitbeschäftige", caption= "Quelle: Allbus 2016" ) + * scale_y_discrete(labels = lab_vec , limits = rev(names(lab_vec)) ) ``` ] .panel2-manual[  ] --- # Koeffzientenplot labeln mit Vector .panel1-manual[ ``` r lab_vec2 <- c( * "sexw" = "Frau", "age" = "Alter", "educ2" = "Hauptschule", "educ3" = "Mittlere Reife", "educ4" = "Fachabi", "educ5" = "Abi", "eastwest2" = "neue Länder" ) ggplot(data = df_coef, aes(y = term, x = estimate)) + geom_vline(aes(xintercept = 0),linetype = 2) + geom_point(size = 2) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .25) + theme_minimal() + aes(color = sub("\\d$", "", term) ) + scale_color_brewer(palette = "Paired") + guides(color = 'none') + labs(y = "" ) + labs(x = expression(hat(beta)) ) + labs(title = "Einkommen", subtitle = "Vollzeitbeschäftige", caption= "Quelle: Allbus 2016" ) + * scale_y_discrete(labels = lab_vec2 , limits = rev(names(lab_vec2)) ) ``` ] .panel2-manual[  ] --- # Modellvergleich .blade1[Häufig interessiert uns nur eine Variable: <br> .smallish[Wie verändert sich der Gender Pay Gap nach Kontrolle für verschiedene Variablen?]] .panel1-manual[ + Modell 1 ``` r m1 <- lm(inc ~ sex , data = a16_ft) m1_df <- tidy(m1,conf.int=95) %>% filter(term == "sexw") ``` + Modell 2 ``` r m2 <- lm(inc ~ sex + age + I(age^2), data = a16_ft) m2_df <- tidy(m2,conf.int=95) %>% filter(term == "sexw") ``` + Modell 3 ``` r m3 <- lm(inc ~ sex + age + I(age^2) + educ + eastwest + gkpol, data = a16_ft) m3_df <- tidy(m3,conf.int=95) %>% filter(term == "sexw") ``` ] .panel2-manual[ ``` term estimate std.error statistic p.value conf.low conf.high 1 sexw -640.816 69.281 -9.249 0 -776.724 -504.909 ``` <br> <br> <br> <br> ``` term estimate std.error statistic p.value conf.low conf.high 1 sexw -607.369 66.626 -9.116 0 -738.067 -476.672 ``` <br> <br> <br> ``` term estimate std.error statistic p.value conf.low conf.high 1 sexw -690.624 60.148 -11.482 0 -808.615 -572.632 ``` ] --- # Modellvergleich .blade1[.smallish[Mit `bind_rows` können wir die ausgewählten Zeilen zu einem neuen `data.frame` zusammenfügen. Mit `.id` können wir eine ID-Variable für die Modelle setzen]] .small[ ``` r sex_coef <- bind_rows(m1_df %>% filter(term == "sexw"), m2_df %>% filter(term == "sexw"), m3_df %>% filter(term == "sexw"), * .id = "model") ``` ``` r sex_coef ``` ``` model term estimate std.error statistic p.value conf.low conf.high 1 1 sexw -640.82 69.28 -9.25 0 -776.72 -504.91 2 2 sexw -607.37 66.63 -9.12 0 -738.07 -476.67 3 3 sexw -690.62 60.15 -11.48 0 -808.61 -572.63 ``` ] **Diesen `data.frame` können wir jetzt wieder (gg-)ploten** --- # Modellvergleich .panel1-manual[ ``` r ggplot(data = sex_coef) + aes(y = model)+ aes(x = estimate) + geom_point(size = 2.78) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .2) + theme_minimal() + labs(y = "Kontrollvariablen" ) + labs(x = expression(hat(beta)) ) + labs(title = "Einkommensunterschied Frauen vs. Männer") + labs(subtitle = "Vollzeitbeschäftige") + labs(caption= "Quelle: Allbus 2016" ) ``` ] .panel2-manual[  ] --- # Modellvergleich .panel1-manual[ ``` r ggplot(data = sex_coef) + aes(y = model)+ aes(x = estimate) + geom_point(size = 2.78) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .25) + theme_minimal() + labs(y = "Kontrollvariablen" ) + labs(x = expression(hat(beta)) ) + labs(title = "Einkommensunterschied Frauen vs. Männer") + labs(subtitle = "Vollzeitbeschäftige") + labs(caption= "Quelle: Allbus 2016" ) + * scale_y_discrete(breaks = c(1:3), * labels = c("keine", * "Alter", * "Alter, Bildung, Ost/West")) ``` ] .panel2-manual[  ] --- # Modellvergleich .panel1-manual[ ``` r ggplot(data = sex_coef) + aes(y = model)+ aes(x = estimate) + geom_point(size = 2.78) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .25) + theme_minimal() + labs(y = "Kontrollvariablen" ) + labs(x = expression(hat(beta)) ) + labs(title = "Einkommensunterschied Frauen vs. Männer") + labs(subtitle = "Vollzeitbeschäftige") + labs(caption= "Quelle: Allbus 2016" ) + scale_y_discrete(breaks = c(1:3), labels = c("keine", "Alter", * "Alter, \nBildung, \nOst/West")) ``` ] .panel2-manual[  ] --- # Modellvergleich .panel1-manual[ ``` r ggplot(data = sex_coef) + aes(y = model)+ aes(x = estimate) + geom_point(size = 2.78) + geom_errorbarh(aes(xmin=conf.low, xmax = conf.high)) + aes(height = .25) + theme_minimal() + * labs(y = "Kontroll-\nvariablen" ) + labs(x = expression(hat(beta)) ) + labs(title = "Einkommensunterschied Frauen vs. Männer") + labs(subtitle = "Vollzeitbeschäftige") + labs(caption= "Quelle: Allbus 2016" ) + scale_y_discrete(breaks = c(1:3), labels = c("keine", "Alter", "Alter, \nBildung, \nOst/West")) + * theme(axis.title.y = element_text(angle = 0,vjust = 1)) ``` ] .panel2-manual[  ] --- # Quadratische und Interaktionsterme .smaller[ ``` r m4 <- lm(inc ~ sex + age + I(age^2) , data = a16_ft) m5 <- lm(inc ~ sex * age + I(age^2) , data = a16_ft) ``` ] .smaller[ ``` r tidy(m4,conf.int=95) ``` .center[ ``` term estimate std.error statistic p.value conf.low conf.high 1 (Intercept) -455.755 389.059 -1.171 0.242 -1218.964 307.453 2 sexw -601.476 66.173 -9.089 0.000 -731.286 -471.665 3 age 116.748 19.588 5.960 0.000 78.324 155.173 4 I(age^2) -1.059 0.233 -4.537 0.000 -1.516 -0.601 ``` ] ``` r tidy(m5,conf.int=95) ``` .center[ ``` term estimate std.error statistic p.value conf.low conf.high 1 (Intercept) -945.584 402.923 -2.347 0.019 -1735.990 -155.179 2 sexw 404.371 242.144 1.670 0.095 -70.638 879.379 3 age 131.130 19.747 6.640 0.000 92.392 169.868 4 I(age^2) -1.126 0.232 -4.847 0.000 -1.582 -0.670 5 sexw:age -23.375 5.416 -4.316 0.000 -33.999 -12.751 ``` ] ] --- # Koeffizientenplot .blade1[Manchmal sind Koeffizientenplots an sich aber wenig informativ] .smaller[ ``` r m4 <- lm(inc ~ sex + age + I(age^2) , data = a16_ft) m5 <- lm(inc ~ sex * age + I(age^2) , data = a16_ft) ``` ] .smaller[ <img src="data:image/png;base64,#D:/uolCloud/webseite/andreas/courses/ggplot_flipbook/index_files/figure-html/unnamed-chunk-37-1.png" style="display: block; margin: auto;" /> ] --- # Vorhergesagte Werte mit [**ggeffects**](https://strengejacke.github.io/ggeffects/index.html) .smaller[ [`ggpredict()`](https://strengejacke.github.io/ggeffects/reference/ggpredict.html) aus [`{ggeffects}`](https://strengejacke.github.io/ggeffects/index.html) liefert vorhergesagte Werte.] .smaller[ ``` r install.packages("ggeffects") library(ggeffects) ``` ] .smaller[ .smaller[ `ggpredict()` berechnet die vorhergesagten Werte der abhängigen Variable für bestimmte Werte der fokalen unabh. Variable einer *typischen* Beobachtung in den Daten - dafür werden die anderen unabh. Variablen je nach Variablentyp auf das arith. Mittel (numeric), das Referenz-Level (factor) oder den Modus (character) gesetzt [(mehr hier)](https://strengejacke.github.io/ggeffects/index.html). Dieses Vorgehen hat auch Nachteile, [`{marginaleffects}`](https://marginaleffects.com/chapters/predictions.html#interesting-grid) bietet umfangreiche Alternativen - auch hier ist das Resultat ein data.frame, der dann geplottet werden kann. ] ] .smaller[ ``` r m4 <- lm(inc ~ sex + age + I(age^2) , data = a16_ft) lm_4 <- ggpredict(m4, terms = c("age[20,30,40,50,60]","sex")) ``` ``` r lm_4 ``` ] .smaller[ <table> <thead> <tr> <th style="text-align:right;"> x </th> <th style="text-align:right;"> predicted </th> <th style="text-align:right;"> std.error </th> <th style="text-align:right;"> conf.low </th> <th style="text-align:right;"> conf.high </th> <th style="text-align:left;"> group </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;font-weight: bold;"> 20 </td> <td style="text-align:right;font-weight: bold;"> 1455.802 </td> <td style="text-align:right;"> 105.095 </td> <td style="text-align:right;"> 1249.639 </td> <td style="text-align:right;"> 1661.966 </td> <td style="text-align:left;font-weight: bold;"> m </td> </tr> <tr> <td style="text-align:right;font-weight: bold;"> 20 </td> <td style="text-align:right;font-weight: bold;"> 854.327 </td> <td style="text-align:right;"> 108.197 </td> <td style="text-align:right;"> 642.079 </td> <td style="text-align:right;"> 1066.574 </td> <td style="text-align:left;font-weight: bold;"> w </td> </tr> <tr> <td style="text-align:right;font-weight: bold;"> 30 </td> <td style="text-align:right;font-weight: bold;"> 2094.028 </td> <td style="text-align:right;"> 53.718 </td> <td style="text-align:right;"> 1988.650 </td> <td style="text-align:right;"> 2199.405 </td> <td style="text-align:left;font-weight: bold;"> m </td> </tr> <tr> <td style="text-align:right;font-weight: bold;"> 30 </td> <td style="text-align:right;font-weight: bold;"> 1492.552 </td> <td style="text-align:right;"> 62.529 </td> <td style="text-align:right;"> 1369.890 </td> <td style="text-align:right;"> 1615.214 </td> <td style="text-align:left;font-weight: bold;"> w </td> </tr> <tr> <td style="text-align:right;font-weight: bold;"> 40 </td> <td style="text-align:right;font-weight: bold;"> 2520.550 </td> <td style="text-align:right;"> 52.874 </td> <td style="text-align:right;"> 2416.828 </td> <td style="text-align:right;"> 2624.272 </td> <td style="text-align:left;font-weight: bold;"> m </td> </tr> <tr> <td style="text-align:right;font-weight: bold;"> 40 </td> <td style="text-align:right;font-weight: bold;"> 1919.075 </td> <td style="text-align:right;"> 63.729 </td> <td style="text-align:right;"> 1794.059 </td> <td style="text-align:right;"> 2044.090 </td> <td style="text-align:left;font-weight: bold;"> w </td> </tr> </tbody> </table> ] --- # Quadratischer Term .panel1-manual[ ``` r m4 <- lm(inc ~ sex + age + I(age^2) , data = a16_ft) lm_4 <- ggpredict(m4, terms = c("age[20,30,40,50,60]","sex")) ggplot(lm_4) + * aes(x=x, y=predicted, colour = group) + * aes(ymin= conf.low, ymax = conf.high) + geom_line() + geom_point() + * geom_errorbar(width = .35) + theme_minimal() ``` ] .panel2-manual[  ] --- # Quadratischer Term .panel1-manual[ ``` r m4 <- lm(inc ~ sex + age + I(age^2) , data = a16_ft) lm_4 <- ggpredict(m4, terms = c("age[20,30,40,50,60]","sex")) ggplot(lm_4) + aes(x=x, y=predicted, colour = group) + aes(ymin= conf.low, ymax = conf.high) + geom_line() + geom_point() + geom_errorbar(width = .35) + theme_minimal() + scale_y_continuous(label = scales::label_currency(suffix = "€",prefix = "",big.mark = "")) + * labs(title = "Einkommen für Frauen und Männer nach Alter", * y = "vorhergesagte Werte", * x = "Alter", * color = "Geschlecht") ``` ] .panel2-manual[  ] --- # Quadratischer Term .panel1-manual[ ``` r m4 <- lm(inc ~ sex + age + I(age^2) , data = a16_ft) lm_4 <- ggpredict(m4, terms = c("age[20,30,40,50,60]","sex")) ggplot(lm_4) + aes(x=x, y=predicted, colour = group) + aes(ymin= conf.low, ymax = conf.high) + geom_line() + geom_point() + geom_errorbar(width = .35) + theme_minimal() + scale_y_continuous(label = scales::label_currency(suffix = "€",prefix = "",big.mark = "")) + * labs(title = "Einkommen für Frauen und Männer nach Alter", * y = "vorhergesagte Werte", * x = "Alter", * color = "Geschlecht") + * scale_color_brewer(palette = "Accent") ``` ] .panel2-manual[  ] --- # Interaktionsterm .panel1-manual[ ``` r *m5 <- lm(inc ~ sex * age + I(age^2) , data = a16_ft) lm_5 <- ggpredict(m5, terms = c("age[20,30,40,50,60]","sex")) ggplot(lm_5) + aes(x=x, y=predicted, colour = group) + aes(ymin= conf.low, ymax = conf.high) + geom_line() + geom_point() + geom_errorbar(width = .35) + theme_minimal() + scale_y_continuous(label = scales::label_currency(suffix = "€",prefix = "",big.mark = "")) + labs(title = "Einkommen für Frauen und Männer nach Alter", y = "vorhergesagte Werte", x = "Alter", color = "Geschlecht") ``` ] .panel2-manual[  ] --- # Interaktionsterm .panel1-manual[ ``` r m5 <- lm(inc ~ sex * age + I(age^2) , data = a16_ft) *lm_5 <- ggpredict(m5, terms = c("age[20,25,30,35,40,45,50,55,60]","sex")) ggplot(lm_5) + aes(x=x, y=predicted, colour = group) + aes(ymin= conf.low, ymax = conf.high) + geom_line() + geom_point() + geom_errorbar(width = .35) + theme_minimal() + scale_y_continuous(label = scales::label_currency(suffix = "€",prefix = "",big.mark = "")) + labs(title = "Einkommen für Frauen und Männer nach Alter", y = "vorhergesagte Werte", x = "Alter", color = "Geschlecht") ``` ] .panel2-manual[  ] --- # Interaktionsterm .blade1[.smallish[Natürlich können wir auch hier Kontrollvariablen aufnehmen - zB. `eastwest`. Diese können wir dann als `facets` im Plot verwenden]] ``` r m6 <- lm(inc ~ sex * age + I(age^2) + eastwest , data = a16_ft) lm_6 <- ggpredict(m6, terms = c("age[20,25,30,35,40,45,50,55,60]","sex","eastwest")) ``` ``` r lm_6 ``` <div class="tabwid"><style>.cl-c43c7a52{}.cl-c4323f06{font-family:'Fira Mono';font-size:9pt;font-weight:bold;font-style:normal;text-decoration:none;color:rgba(0, 0, 0, 1.00);background-color:transparent;}.cl-c4323f10{font-family:'Fira Mono';font-size:9pt;font-weight:bold;font-style:normal;text-decoration:none;color:rgba(211, 54, 130, 1.00);background-color:transparent;}.cl-c4323f11{font-family:'Fira Mono';font-size:9pt;font-weight:normal;font-style:normal;text-decoration:none;color:rgba(0, 0, 0, 1.00);background-color:transparent;}.cl-c43599d0{margin:0;text-align:right;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);padding-bottom:0;padding-top:0;padding-left:2pt;padding-right:2pt;line-height: 1;background-color:transparent;}.cl-c43599da{margin:0;text-align:left;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);padding-bottom:0;padding-top:0;padding-left:2pt;padding-right:2pt;line-height: 1;background-color:transparent;}.cl-c435af60{width:0.75in;background-color:rgba(207, 224, 231, 1.00);vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-c435af6a{width:0.75in;background-color:rgba(207, 224, 231, 1.00);vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-c435af74{width:0.75in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-c435af75{width:0.75in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-c435af76{width:0.75in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-c435af7e{width:0.75in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}</style><table data-quarto-disable-processing='true' class='cl-c43c7a52'><thead><tr style="overflow-wrap:break-word;"><th class="cl-c435af60"><p class="cl-c43599d0"><span class="cl-c4323f06">x</span></p></th><th class="cl-c435af60"><p class="cl-c43599d0"><span class="cl-c4323f06">predicted</span></p></th><th class="cl-c435af60"><p class="cl-c43599d0"><span class="cl-c4323f06">std.error</span></p></th><th class="cl-c435af60"><p class="cl-c43599d0"><span class="cl-c4323f06">conf.low</span></p></th><th class="cl-c435af60"><p class="cl-c43599d0"><span class="cl-c4323f06">conf.high</span></p></th><th class="cl-c435af6a"><p class="cl-c43599da"><span class="cl-c4323f06">group</span></p></th><th class="cl-c435af6a"><p class="cl-c43599da"><span class="cl-c4323f10">facet</span></p></th></tr></thead><tbody><tr style="overflow-wrap:break-word;"><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">20</span></p></td><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">1,357.506</span></p></td><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">115.503</span></p></td><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">1,130.926</span></p></td><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">1,584.086</span></p></td><td class="cl-c435af75"><p class="cl-c43599da"><span class="cl-c4323f11">m</span></p></td><td class="cl-c435af75"><p class="cl-c43599da"><span class="cl-c4323f10">1</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">20</span></p></td><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">812.957</span></p></td><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">124.842</span></p></td><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">568.058</span></p></td><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">1,057.856</span></p></td><td class="cl-c435af7e"><p class="cl-c43599da"><span class="cl-c4323f11">m</span></p></td><td class="cl-c435af7e"><p class="cl-c43599da"><span class="cl-c4323f10">2</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">20</span></p></td><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">1,261.362</span></p></td><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">126.693</span></p></td><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">1,012.830</span></p></td><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">1,509.893</span></p></td><td class="cl-c435af75"><p class="cl-c43599da"><span class="cl-c4323f11">w</span></p></td><td class="cl-c435af75"><p class="cl-c43599da"><span class="cl-c4323f10">1</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">20</span></p></td><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">716.813</span></p></td><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">137.186</span></p></td><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">447.698</span></p></td><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">985.928</span></p></td><td class="cl-c435af7e"><p class="cl-c43599da"><span class="cl-c4323f11">w</span></p></td><td class="cl-c435af7e"><p class="cl-c43599da"><span class="cl-c4323f10">2</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">25</span></p></td><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">1,780.734</span></p></td><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">80.518</span></p></td><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">1,622.782</span></p></td><td class="cl-c435af74"><p class="cl-c43599d0"><span class="cl-c4323f11">1,938.685</span></p></td><td class="cl-c435af75"><p class="cl-c43599da"><span class="cl-c4323f11">m</span></p></td><td class="cl-c435af75"><p class="cl-c43599da"><span class="cl-c4323f10">1</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">25</span></p></td><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">1,236.185</span></p></td><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">91.620</span></p></td><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">1,056.457</span></p></td><td class="cl-c435af76"><p class="cl-c43599d0"><span class="cl-c4323f11">1,415.913</span></p></td><td class="cl-c435af7e"><p class="cl-c43599da"><span class="cl-c4323f11">m</span></p></td><td class="cl-c435af7e"><p class="cl-c43599da"><span class="cl-c4323f10">2</span></p></td></tr></tbody></table></div> --- # Interaktionsterm .panel1-manual[ ``` r m6 <- lm(inc ~ sex * age + I(age^2) + eastwest , data = a16_ft) lm_6 <- ggpredict(m6, terms = c("age[20,25,30,35,40,45,50,55,60]","sex", * "eastwest")) ggplot(lm_6) + aes(x=x, y=predicted, colour = group) + aes(ymin= conf.low, ymax = conf.high) + geom_line() + geom_point() + geom_errorbar(width = .35)+ * facet_wrap(~facet) + theme_minimal() + scale_y_continuous(label = scales::label_currency(suffix = "€",prefix = "",big.mark = "")) + labs(title = "Einkommen für Frauen und Männer nach Alter & Ost/West", y = "vorhergesagte Werte", x = "Alter", color = "Geschlecht") ``` ] .panel2-manual[  ] --- # Interaktionsterm .panel1-manual[ ``` r m6 <- lm(inc ~ sex * age + I(age^2) + eastwest , data = a16_ft) lm_6 <- ggpredict(m6, terms = c("age[20,25,30,35,40,45,50,55,60]","sex", * "eastwest")) ggplot(lm_6) + aes(x=x, y=predicted, colour = group) + aes(ymin= conf.low, ymax = conf.high) + geom_line() + geom_point() + geom_errorbar(width = .35)+ * facet_wrap(~facet, labeller = labeller(facet = c("1"="West","2"="Ost"))) + theme_minimal() + scale_y_continuous(label = scales::label_currency(suffix = "€",prefix = "",big.mark = "")) + labs(title = "Einkommen für Frauen und Männer nach Alter & Ost/West", y = "vorhergesagte Werte", x = "Alter", color = "Geschlecht") ``` ] .panel2-manual[  ] --- # Interaktionsterm .panel1-manual[ ``` r m6 <- lm(inc ~ sex * age + I(age^2) + eastwest , data = a16_ft) lm_6 <- ggpredict(m6, terms = c("age[20,25,30,35,40,45,50,55,60]","sex", "eastwest")) ggplot(lm_6) + aes(x=x, y=predicted, * colour = interaction(facet,group)) + aes(ymin= conf.low, ymax = conf.high) + geom_line() + geom_point() + geom_errorbar(width = .35)+ theme_minimal() + scale_y_continuous(label = scales::label_currency(suffix = "€",prefix = "",big.mark = "")) + labs(title = "Einkommen für Frauen und Männer nach Alter & Ost/West", y = "vorhergesagte Werte", x = "Alter", color = "Geschlecht") + * scale_color_ordinal() ``` ] .panel2-manual[  ] --- # Interaktionsterm .panel1-manual[ ``` r m6 <- lm(inc ~ sex * age + I(age^2) + eastwest , data = a16_ft) lm_6 <- ggpredict(m6, terms = c("age[20,25,30,35,40,45,50,55,60]","sex", "eastwest")) ggplot(lm_6) + aes(x=x, y=predicted, colour = interaction(facet,group)) + aes(ymin= conf.low, ymax = conf.high) + geom_line() + geom_point() + geom_errorbar(width = .35)+ theme_minimal() + scale_y_continuous(label = scales::label_currency(suffix = "€",prefix = "",big.mark = "")) + labs(title = "Einkommen für Frauen und Männer nach Alter & Ost/West", y = "vorhergesagte Werte", x = "Alter", color = "Geschlecht") + scale_color_ordinal( * breaks = c("1.m","2.m","1.w","2.w"), * labels = c("Männer - West", "Männer - Ost", * "Frauen - West","Frauen - Ost") ) ``` ] .panel2-manual[  ] --- # Abschließende Bemerkungen .smaller[ + alle Befehle & Strategien funktionieren am besten, wenn kategoriale Variablen **vorab** als `factor` definiert wurden + dabei können entweder die existierenden Ausprägungen (Zahlencodes) behalten oder diese mit labels überschrieben werden + zB für `sex`: ``` r a16_ft$sex <- factor(a16_ft$sex, levels = c(1,2), labels = c("m","w") ) ``` Hier werden also 1 und 2 mit `m` und `w` überschrieben + Die Strategie für logistische `glm` oder Cox-Regressionsmodelle `coxph` entspricht dem Vorgehen bei OLS-Regressionsmodellen + Für Koeffizientenplots ist jedoch jeweils zu beachten, ob logit-Koeffizienten, Odds/Hazard Ratios oder average marginal effects dargestellt werden sollen + Mehr zu `ggeffects` gibt es zB. [hier](https://cran.r-project.org/web/packages/ggeffects/vignettes/marginaleffects.html) + Alternativ können die marginal effects/adjusted predictions auch mit dem Paket [`{marginaleffects}`](https://marginaleffects.com/) berechnet werden - auch hier ist das Resultat ein data.frame, der dann geplottet werden kann ] --- # Übungsaufgaben 3 .smaller[ + Laden Sie den kumulierten Allbus-Datensatz (siehe Hinweise am Ende) + Filtern Sie die in Vollzeit erwerbstätigen Befragten aus 2014: ``` r a14_ft <- ak %>% filter(year == 2014, work == 1) ``` + Berechnen Sie Regressionsmodelle mit `inc` als abhängiger Variable, indem Sie Modell für Modell folgende unab. Variablen einfügen: + `sex` (Geschlecht der Befragten) + `age` (Alter der Befragten) + `hs18` (Körpergröße der Befragten) + `educ` (Bildungsabschluss) + `gkpol` (Wohnortgröße) + Definieren Sie die kategorialen Variablen (`sex`, `educ`, `gkpol`) als `factor`! + Erstellen Sie Koeffizientenplots für die Modelle! + Wie verändert sich der Koeffizient für das Geschlecht mit zusätzlichen Kontrollvariablen? Erstellen Sie eine entsprechende Darstellung! .smallish[...Fortsetzung nächste Seite] ] --- # Übungsaufgaben 3 (Fortsetzung) .smaller[ + Erstellen Sie folgendes Regressionsmodell: ``` r lm_q <- lm(inc ~ sex * age + I(age^2)) ``` + Erstellen Sie mit `ggpredict` die vorhergesagten Werte + Erstellen Sie die passende graphische Darstellung! ] --- # Fälle hervorheben ``` r install.packages("ggrepel") library(ggrepel) ``` .smallish[ Beispiele gibt es bspw. [hier](https://cran.r-project.org/web/packages/ggrepel/vignettes/ggrepel.html) ] --- # Linksammlung + das [R Graphics Cookbook](http://www.cookbook-r.com/Graphs/) bietet eine umfangreiche Sammlung an Beispielplots inkl. dazugehöriger Syntax + das [ggplot2 Cheatsheet](https://github.com/rstudio/cheatsheets/blob/master/data-visualization-2.1.pdf) gibt eine Übersicht zu den wichtigsten Funktionen und Befehlen + [50 Beispiele](http://r-statistics.co/Top50-Ggplot2-Visualizations-MasterList-R-Code.html) von ggplot2-Graphiken + [R Graph Gallery](https://wwwr-graph-gallery.com) mit verschiedensten Darstellungsformen + [ggplot-Flipbook](https://evamaerey.github.io/ggplot_flipbook/ggplot_flipbook_xaringan.html#1) mit Beispielen + [Liste](http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf) aller Farben in R + [Hex-Codefinder](https://www.color-hex.com/) + [ColorBrewer](http://colorbrewer2.org): Farbpaletten über `scale_..._brewer()` direkt abrufbar + Weitere Pakete: + [`scico`](https://github.com/thomasp85/scico): weitere Farbpaletten über `scale_..._scico()` + [`ggthemes`](https://yutannihilation.github.io/allYourFigureAreBelongToUs/ggthemes/) weitere Themes + [`patchwork`](https://github.com/thomasp85/patchwork) ggplots kombinieren + [`gganimate`](https://github.com/thomasp85/gganimate) ggplots in gifs verwandeln --- # Einlesen der Beispieldatensätze .smaller[ ``` r install.packages(c("readxl","dplyr")) ``` ] **Weihnachtsbäume** .smaller[ ``` r library(dplyr) christmas_trees_file <- "Pfad/in/den/gewünschten/Ordner/christmas_trees.xlsx" # Dateiname anpassen url1 <- "https://github.com/EvaMaeRey/ggplot_flipbook/raw/refs/heads/master/raw_data/Christmas%20tree%20sales.xlsx" # Datenquelle # Daten herunterladen und speichern if (!file.exists(file)) { download.file(url = url1,mode = "wb", destfile = christmas_trees_file) } christmas_trees <- readxl::read_xlsx(christmas_trees_file) %>% rename(anz_baeume = `Number of trees sold`, baumart = `Type of tree`, jahr = Year) ``` ] **Inhaftierungszahlen** .smaller[ ``` r prison_file <- "Pfad/in/den/gewünschten/Ordner/prison_summary.csv" # Dateiname anpassen url2 <- "https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-01-22/prison_summary.csv" # Datenquelle # Daten herunterladen und speichern if (!file.exists(file)) { download.file(url = url2,mode = "wb", destfile = prison_file) } df2 <- readr::read_csv(prison_file) %>% filter(!(pop_category %in% c("Female", "Male", "Total", "Other"))) ``` ] --- # Einlesen der Allbus-Datensätze Die Daten der "**All**gemeinen **B**evölkerungs**u**mfrage der **S**ozialwissenschaften" (ALLBUS) können für Forschung und Lehre [hier](https://www.gesis.org/allbus) beantragt werden. #### Allbus 2016 Für die Beispiele werden nur die Vollzeit erwerbstätigen Befragten (`work == 1`) mit abgeschlossenem Bildungsabschluss (`educ`) verwendet, die auch unter 65 Jahre alt sind: ``` r library(tidyverse) a16_ft <- readr::read_delim("ZA5250_v2-0-0.csv",delim = ";") %>% filter(work == 1, age <= 64, educ %in% 1:5) %>% mutate(across(everything(),~ifelse(.x<0,NA,.)), across(c(educ,sex,eastwest,gkpol),~factor(.x)), sex = factor(sex, levels = c(1,2), labels = c("m","w")) ) %>% filter(complete.cases(sex, age , educ , eastwest , gkpol)) ```